/*
 * $Id: PDFFont.java,v 1.1.1.1 2001/10/29 19:51:08 ezb Exp $
 *
 * $Date: 2001/10/29 19:51:08 $
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public 
 * License as published by the Free Software Foundation; either 
 * version 2.1 of the License, or (at your option) any later version. 
 * 
 * This library is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
 * Lesser General Public License for more details. 
 * 
 * You should have received a copy of the GNU Lesser General Public 
 * License along with this library; if not, write to the Free Software 
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 */
package gnu.jpdf;

import java.awt.Font;
import java.io.*;

/**
 * This class defines a font within a PDF document.
 *
 * @author Peter T Mount,http://www.retep.org.uk/pdf/
 * @author Eric Z. Beard, ericzbeard@hotmail.com
 * @author $Author: ezb $
 * @version $Revision: 1.1.1.1 $, $Date: 2001/10/29 19:51:08 $
 */
public class PDFFont extends PDFObject implements Serializable
{

	private static final long serialVersionUID = 1L;
	/*
	 * NOTE: The original class is the work of Peter T. Mount, who released it 
	 * in the uk.org.retep.pdf package.  It was modified by Eric Z. Beard as 
	 * follows: 
	 * The package name was changed to gnu.pdf.  
	 * The formatting was changed a little bit
	 * It is still licensed under the LGPL.
	 */

	/**
	 * The PDF document name of the font
	 */
	private String name;

	/**
	 * The PDF type of the font, usually /Type1
	 */
	private String type;

	/**
	 * The font's real name
	 */
	private String font;

	/**
	 * The name of the equivalent Java font
	 */
	private String javaFont;

	/** 
	 * The PDF Style, ie: BOLD, ITALIC, etc
	 */
	private int style;

	/**
	 * This constructs a default PDFFont. In this case Helvetica
	 */
	protected PDFFont() 
	{this("/F1","/Type1","Helvetica",Font.PLAIN);}

	/**
	 * Constructs a PDFFont. This will attempt to map the font from a known
	 * Java font name to that in PDF, defaulting to Helvetica if not possible.
	 *
	 * @param name The document name, ie /F1
	 * @param type The pdf type, ie /Type1
	 * @param font The font name, ie Helvetica
	 * @param style The java.awt.Font style, ie: Font.PLAIN
	 */
	public PDFFont(String name,String type,String font,int style) 
	{
		super("/Font");
		this.name = name;
		this.type = type;
		this.style = style;
		String f = font.toLowerCase();
		// default PDF Font name
		this.font = base14[0][1];
		this.javaFont = base14[0][0];
		// attempt to translate the font name from Java to PDF
		for(int i=0;i<base14.length;i++) 
		{
			if(base14[i][0].equals(f))
			{
				this.javaFont = base14[i][0];
				this.font =  base14[i][1+style];
				//System.out.println("Setting a font style to: " + this.font);
				break;
			}
		}
	}

	/**
	 * This is the most common method to use.
	 * @return the Font name within the PDF document.
	 */
	public String getName() 
	{return name;}

	/**
	 * @return the Font's PDF type
	 */
	public String getType()
	{return type;}

	/**
	 * @return The PDF Font name
	 */
	public String getFont() 
	{return font;}

	/**
	 * @return the font style.
	 * @see java.awt.Font
	 */
	public int getStyle()
	{return style;}

	/**
	 * @param os OutputStream to send the object to
	 * @exception IOException on error
	 */
	public void write(OutputStream os) throws IOException 
	{
		// Write the object header
		writeStart(os);

		// now the objects body
		os.write("/Subtype ".getBytes());
		os.write(type.getBytes());
		os.write("\n/Name ".getBytes());
		os.write(name.getBytes());
		os.write("\n/BaseFont ".getBytes());
		os.write(font.getBytes());
		// The performance problem in Bug#106693 comments out the
		// encoding line, and removes the /WinAnsiEncoding. I'm going
		// to leave them in, as the Encoding fixes another problem.
		os.write("\n/Encoding ".getBytes());
		os.write("/WinAnsiEncoding".getBytes());
		//os.write(encoding.getBytes());
		os.write("\n".getBytes());

		// finish off with its footer
		writeEnd(os);
	}

	/**
	 * This is used by the PDF and PDFPage classes to compare font names
	 *
	 * @param type The pdf type, ie /Type1
	 * @param font The font name, ie Helvetica
	 * @param style The java.awt.Font style, ie: Font.PLAIN
	 * @return true if this object is identical to this font's spec
	 */
	protected boolean equals(String type,String font,int style) 
	{
		return this.type.equals(type)&& (this.font.equals(font)
				&& this.javaFont.equalsIgnoreCase(font));
		// new styles not being picked up - ezb june 6 2001
		// || this.javaFont.equalsIgnoreCase(font));
		// Removed in fix for Bug#106693
		//why? - ezb - can't find bug in bug tracker
		//&& this.style==style;
	}

	/**
	 * This maps the standard JDK1.1 font names and styles to
	 * the base 14 PDF fonts
	 */
	private static String[][] base14 = {
		// java name    
		// NORMAL          
		// BOLD            
		// ITALIC                  
		// BOLD+ITALIC
		{"sansserif",   
			"/Helvetica",   
			"/Helvetica-Bold",
			"/Helvetica-Oblique", 
		"/Helvetica-BoldOblique"},
		{"monospaced",  
			"/Courier",     
			"/Courier-Bold",
			"/Courier-Oblique",     
		"/Courier-BoldOblique"},
		{"timesroman",  
			"/Times-Roman", 
			"/Times-Bold",  
			"/Times-Italic",        
		"/Times-BoldItalic"},
		{"courier",     
			"/Courier",     
			"/Courier-Bold",
			"/Courier-Oblique",     
		"/Courier-BoldOblique"},
		{"helvetica",   
			"/Helvetica",   
			"/Helvetica-Bold",
			"/Helvetica-Oblique", 
		"/Helvetica-BoldOblique"},
		{"dialog",      
			"/Courier",     
			"/Courier-Bold",
			"/Courier-Oblique",     
		"/Courier-BoldOblique"},
		{"dialoginput", 
			"/Courier",     
			"/Courier-Bold",
			"/Courier-Oblique",     
		"/Courier-BoldOblique"},
	};
}